﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;

namespace Sl.Duplex {
	public static class SerialPort_expand {
		static char[] separator = { ',' };
		public static string Help = @"命令为：“串口名,[波特率],[位宽度][校验位][停止位长度]”
例如“COM3,115200,8N1”
其中校验位为 
	N	无校验
	E	偶校验
	O	奇校验
	M	固定为1
	S	固定为0
停止位为
	1	1长度停止位
	H	1.5长度停止位
	2	2长度停止位
";
		/// <summary>
		/// 
		/// </summary>
		/// <param name="portdesc">string looks like "COM3,115200,8E1"</param>
		/// <returns>如果无问题，则返回Null或者空字符串；
		/// 如果有警告，返回错误原因；
		/// 如果配置失败，返回以【错误】开头的字符串</returns>
		public static string init(this SerialPort serial, string portdesc) {
			StringBuilder warning = new	StringBuilder(256); 
			if (serial == null) {
				serial = new SerialPort();
			}
			string[] description_strs = portdesc.Split(separator, 4);
			serial.BaudRate = 115200;
			if (description_strs.Length == 0) {
				return "【错误】给定的字符串没有内容。";
			}
			if (description_strs.Length >= 1) {
				serial.PortName = description_strs[0];
			}
			if (description_strs.Length >= 2) {
				int var;
				if (Int32.TryParse(description_strs[1], out var)) {
					try { 
						serial.BaudRate = var;
					} catch {
						warning.Append($"波特率无法使用{description_strs[1]}，使用115200。");
						serial.BaudRate = 115200;
					}
				} else {
					warning.Append($"波特率设置为{description_strs[1]}，无法转换为数字，使用115200。");
					serial.BaudRate = 115200;
				}
			}
			if (description_strs.Length >= 3) {
				int var;
				if (description_strs[2].Length > 1) {
					if (Int32.TryParse(description_strs[2].Substring(0, 1), out var)) {
						try {
							serial.DataBits = var;
						} catch {
							warning.Append($"串口数据长度无法使用：{description_strs[2]}，默认使用8位数据。");

						}
					} else {
						warning.Append($"串口数据长度需要是一个数字：{description_strs[2]}，默认使用8位数据。");
					}
				}
				if (description_strs[2].Length > 2) {
					switch (description_strs[2].Substring(1, 1)) {
						case "e":
						case "E":
							serial.Parity = System.IO.Ports.Parity.Even;
							break;
						case "o":
						case "O":
							serial.Parity = System.IO.Ports.Parity.Odd;
							break;
						case "n":
						case "N":
							serial.Parity = System.IO.Ports.Parity.None;
							break;
						case "m":
						case "M":
							serial.Parity = System.IO.Ports.Parity.Mark;
							break;
						case "s":
						case "S":
							serial.Parity = System.IO.Ports.Parity.Space;
							break;
						default:
							warning.Append($"校验字符有误，需要是 E O N M S之一：{description_strs[2]}，使用了无校验。");
							break;
					}
				}
				if (description_strs[2].Length > 3) {
					switch (description_strs[2].Substring(2, 1)) {
						case "1":
							serial.StopBits = System.IO.Ports.StopBits.One;
							break;
						case "2":
							serial.StopBits = System.IO.Ports.StopBits.Two;
							break;
						case "h":
						case "H":
							serial.StopBits = System.IO.Ports.StopBits.OnePointFive;
							break;
						default:
							warning.Append($"停止位长度有误：{description_strs[2]}，使用1字节。");
							break;
					}
				}
			}           
			//如果warning有内容，则加上 【警告】 返回
			if (warning.Length > 0) {
				warning.Insert(0, "【警告】");
				return warning.ToString();
			} else {
				return string.Empty;
			}
		}
	}
}










